package com.yss.sofa.framework.services.report;

import java.io.Serializable;
import java.util.Map;

import com.yss.sofa.framework.services.Service;

/**
 * 报表自定义文件，业务组件实现<br>
 * 用于报表导出自定义格式文件<br>
 * 发布此服务时，需要额外的OSGI服务属性：<br>
 * type：文件类型，负整数，如"-1"，不要与其他同类服务重复<br>
 */
public interface ReportCustomFile extends Service{
	/**
	 * 获取文件类型名称，用于UI
	 * @return 文件类型的名称，如"文本文件"
	 */
	public String getTypeName();
	/**
	 * 获取文件类型后缀
	 * @return 文件类型的后缀，以"."开始，如".txt"
	 */
	public String getTypeSuffix();
	/**
	 * 判断报表是否支持此类型文件的导出
	 * @param code 报表编码
	 * @return true=支持，false=不支持
	 */
	public boolean canExport(String code);
	/**
	 * 生成文件内容，方法只要返回文件内容，不需要在方法内对文件进行持久化
	 * @param report 报表，可通过此参数获取报表各项信息，已知的有（后续根据需要再新增新的key-value）：<br>
	 * 0，report=Serializable，报表对象<br>
	 * 1，code=Stirng，报表code<br>
	 * 2，name=String，报表名称<br>
	 * 3，raw=String[][]，报表主sheet（即sheet[main]的执行结果）所有单元格内容<br>
	 * 4，raws=Map<String,String[][]>，报表所有sheet的所有单元格内容<br>
	 * 5，row=Integer，报表主sheet（即sheet[main]的执行结果）行数<br>
	 * 6，rows=Map<String,Integer>，报表所有sheet的行数<br>
	 * 7，col=Integer，报表主sheet（即sheet[main]的执行结果）列数<br>
	 * 8，cols=Map<String,Integer>，报表所有sheet的列数<br>
	 * 9，title=Integer，报表主sheet（即sheet[main]的执行结果）表头行数<br>
	 * 10，titles=Map<String,Integer>，报表所有sheet的表头行数<br>
	 * 11，header=Integer，报表主sheet（即sheet[main]的执行结果）列头行数<br>
	 * 12，headers=Map<String,Integer>，报表所有sheet的列头行数<br>
	 * 13，detail=Integer，报表主sheet（即sheet[main]的执行结果）明细行数<br>
	 * 14，details=Map<String,Integer>，报表所有sheet的明细行数<br>
	 * 15，footer=Integer，报表主sheet（即sheet[main]的执行结果）表尾行数<br>
	 * 16，footers=Map<String,Integer>，报表所有sheet的表尾行数<br>
	 * 17，ranges=Integer[][]，报表主sheet（即sheet[main]的执行结果）的合并区域，第二维是Ingeter[4]，依次为合并区域的top、left、bottom、right<br>
	 * 18，multi-ranges=Map<String,Integer[][]>，报表所有sheet的合并区域<br>
	 * 19，excel=byte[]，excel文件<br>
	 * 20，params=Map<String,Serializable>，报表的类型化参数，可通过params.get("CONSTS")得到所有常量（Map<String,String>）<br>
	 * 21，rawparams=Map<String,String>，报表的原始参数<br>
	 * 22，sheets=Map<String,String>，key=模板sheet名，value=报表sheet名<br>
	 * @return 文件内容，此数据将会直接写到文件中，不会再被二次处理，若返回null或[]则不会产生文件
	 */
	public byte[] export(Map<String, Serializable> report);
}
